const Koa = require("koa");
const app = new Koa();
const views = require("koa-views");
const json = require("koa-json");
const onerror = require("koa-onerror");
const bodyparser = require("koa-bodyparser");
const logger = require("koa-logger");
const MongoConnect = require("./db");
const koajwt = require("koa-jwt");
//解决跨域问题
const cors = require("koa2-cors");
app.use(
  cors({
    origin: function(ctx) {
      //设置允许来自指定域名请求
      if (ctx.url === "/test") {
        return "*"; // 允许来自所有域名请求
      }
      return "http://localhost:8080"; //只允许http://localhost:8080这个域名的请求
    },
    maxAge: 5, //指定本次预检请求的有效期，单位为秒。
    credentials: true, //是否允许发送Cookie
    allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], //设置所允许的HTTP请求方法
    allowHeaders: ["Content-Type", "Authorization", "Accept"], //设置服务器支持的所有头信息字段
    exposeHeaders: ["WWW-Authenticate", "Server-Authorization"], //设置获取其他自定义字段
  })
);

//连接数据库
MongoConnect();

const index = require("./routes/index");
const users = require("./routes/users");
const upload = require("./routes/upload");
const article = require("./routes/article");
const comment = require("./routes/comment");
const fans = require("./routes/fans");
const star = require("./routes/star");
const banner = require("./routes/banner");
// error handler
onerror(app);

// middlewares
app.use(
  bodyparser({
    enableTypes: ["json", "form", "text"],
  })
);
app.use(json());
app.use(logger());
app.use(require("koa-static")(__dirname + "/public"));

app.use(
  views(__dirname + "/views", {
    extension: "pug",
  })
);

// 引入koajwt   unless 中配置不需要jwt认证的接口
app.use(
  koajwt({
    secret: "jianshu-serve-jwt",
  }).unless({
    path: [/^\/users\/login/, 
      /^\/users\/reg/, 
      /^\/article\/web\/findAll/,
      /^\/article\/web\/findViewAll/,
      /^\/banner\/find/,
      /^\/article\/findOne/,
      /^\/comment\/web\/find/],
  })
);

// logger
app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

// routes
app.use(index.routes(), index.allowedMethods());
app.use(users.routes(), users.allowedMethods());
app.use(upload.routes(), upload.allowedMethods());
app.use(article.routes(), article.allowedMethods());
app.use(comment.routes(), comment.allowedMethods());
app.use(fans.routes(), fans.allowedMethods());
app.use(star.routes(), star.allowedMethods());
app.use(banner.routes(), banner.allowedMethods());

// error-handling
app.on("error", (err, ctx) => {
  console.error("server error", err, ctx);
});

module.exports = app;
